import java.util.*;

public class test2 {
   // 15. 三数之和 双指针算法题
    public  static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        HashSet<List<Integer>> set=new HashSet<>();
        Arrays.sort(nums);
        int left=0;
        int ret=nums.length-1;
        while(ret>1){
            int right=ret-1;
            left=0;
            while(left<right) {
                List<Integer> temp = new ArrayList<>();
                if (nums[left] + nums[ret] + nums[right] == 0) {
                    temp.add(nums[left]);
                    temp.add(nums[ret]);
                    temp.add(nums[right]);
                    set.add(temp);
                    //注意这里需要找全不能这个break
                    right--;
                    left++;
                }
                if (nums[left] + nums[ret] + nums[right] > 0) {
                    right--;
                }
                if (nums[left] + nums[ret] + nums[right] < 0) {
                    left++;
                }
            }
            ret--;
        }
        for (Iterator<List<Integer>> it = set.iterator(); it.hasNext(); ) {
            List<Integer> arr = it.next();
            list.add(arr);
        }
        return list;
    }
    //还有错误
    public  static List<List<Integer>> threeSum2(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        Arrays.sort(nums);
        int left=0;
        int ret=nums.length-1;
        while(nums[ret]>=0&&ret>1){
            int right=ret-1;
            left=0;
            while(left<right) {
                List<Integer> temp = new ArrayList<>();
                if (nums[left] + nums[ret] + nums[right] == 0) {

                    list.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[right],nums[ret])));
                    //注意这里需要找全不能这个break
                    right--;
                    left++;
                }
                if (nums[left] + nums[ret] + nums[right] > 0) {
                    right--;
                    while(left!=0&&nums[left-1]==nums[left]){
                        left++;
                    }
                }
                if (nums[left] + nums[ret] + nums[right] < 0) {
                    left++;
                    while(right+1!=ret&&nums[right+1]==nums[right]){
                        right--;
                    }
                }
            }
            ret--;
            while (ret>1&&nums[ret]>=0&&nums[ret]==nums[ret+1]){
                ret--;
            }

        }
        return list;
    }

    public static void main(String[] args) {
        int []arr={0,0,0};
        List<List<Integer>> list=new ArrayList<>();
        list=threeSum2(arr);
        System.out.println(list.toString());
    }
}
